use crate::notification;
use serde::Deserialize;

/// 消息的基础字段
///
/// # 字段类型
/// - `code` - 服务端返回的当前设备的code值（后期可用于设备识别和绑定）
/// - `ty` - 消息的类型基于枚举类型 `MessageType`
/// - `title` - 消息的标题
/// - `body` - 消息主体
/// - `url` - 打开或者发起请求的链接`URL`地址（需要符合URL格式包含请求头例如：https）
///
#[derive(Debug, Deserialize)]
pub struct Message {
    pub code: String,
    pub ty: MessageType,
    pub title: String,
    pub body: String,
    pub url: Option<String>,
}

impl Message {
    pub fn special_treatment(str: &String) -> String {
        str.replace("<", "&lt;").replace(">", "&gt;").replace("&", "&amp;")
    }

    pub fn notification(&mut self) -> windows::core::Result<()> {
        // 进行特殊字符处理
        self.title = Self::special_treatment(&self.title);
        self.body = Self::special_treatment(&self.body);
        self.url = Some(Self::special_treatment(self.url.as_ref().unwrap()));

        match self.ty {
            MessageType::Basic => notification::basic_notification(self)?,
            MessageType::Confirm => notification::confirm_notification(self)?,
            MessageType::Link => notification::link_notification(self)?,
        }
        Ok(())
    }
}

/// 定义系统通知的消息类型枚举
///
/// 该枚举用于区分不同类型的系统通知，
/// 每种类型对应不同的交互行为和视觉样式
///
/// # 枚举选项值
/// - `Basic` - 基础信息通知（仅展示不要求交互）
/// - `Confirm` - 需要确认操作的通知（带确认/取消按钮）
/// - `Link` - 需要打开链接的类型
///
/// # 示例
/// ```rust
/// use MessageType::*;
/// let msg_type = Basic;  // 创建需要交互的通知类型
/// ```
///
/// # 实现细节
/// 与Windows通知系统深度集成，各变体对应不同的XML模板
#[derive(Debug, Deserialize)]
pub enum MessageType {
    Basic,
    Confirm,
    Link
}